package pe.com.cotelasa.scp.dominio.common.util;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import pe.com.cotelasa.scp.dominio.common.Constantes;

public class UtilitarioFecha {

    public static String obtenerFechaActual() {
        Calendar calendario = Calendar.getInstance();
        SimpleDateFormat sdf = new SimpleDateFormat(Constantes.Fecha.FORMATO_FECHA_DEFAULT);
        return sdf.format(calendario.getTime());
    }

    public static String obtenerFechaHoraActual() {
        Calendar calendario = Calendar.getInstance();
        SimpleDateFormat sdf = new SimpleDateFormat(Constantes.Fecha.FORMATO_FECHA_HORA_DEFAULT);
        return sdf.format(calendario.getTime());
    }

    public static Date obtenerFechaActualDate() {
        Calendar calendario = Calendar.getInstance();
        return calendario.getTime();
    }

    public static String formatearFecha(Date fecha, String formato) {
        SimpleDateFormat sdf = new SimpleDateFormat(formato);
        return sdf.format(fecha);
    }

    public static String obtenerHoraActual() {
        Calendar calendario = Calendar.getInstance();
        SimpleDateFormat sdf = new SimpleDateFormat(Constantes.Fecha.FORMATO_HORA_DEFAULT);
        return sdf.format(calendario.getTime());
    }

    public static int obtenerMesActual() {
        Calendar calendario = Calendar.getInstance();
        return calendario.get(Calendar.MONTH);
    }

    public static int obtenerDiaActual() {
        Calendar calendario = Calendar.getInstance();
        return calendario.get(Calendar.DATE);
    }

    public static int obtenerAnioActual() {
        Calendar calendario = Calendar.getInstance();
        return calendario.get(Calendar.YEAR);
    }

    public static int obtenerMes(Date date) {
        Calendar calendario = Calendar.getInstance();
        calendario.setTime(date);
        return calendario.get(Calendar.MONTH);
    }

    public static int obtenerDia(Date date) {
        Calendar calendario = Calendar.getInstance();
        calendario.setTime(date);
        return calendario.get(Calendar.DATE);
    }

    public static int obtenerAnio(Date date) {
        Calendar calendario = Calendar.getInstance();
        calendario.setTime(date);
        return calendario.get(Calendar.YEAR);
    }

    public static Date construirFecha(int ano, int mes, int dia) {
        Calendar calendario = Calendar.getInstance();
        calendario.set(ano, mes, dia);
        return calendario.getTime();
    }

    public static Date construirFecha(int ano, int mes, int dia, int hora, int min, int seg) {
        Calendar calendario = Calendar.getInstance();
        calendario.set(ano, mes, dia, hora, min, seg);
        return calendario.getTime();
    }

    public static String agregarDiasFechaActual(int dias) {
        Calendar calendario = Calendar.getInstance();
        calendario.add(Calendar.DATE, dias);
        SimpleDateFormat sdf = new SimpleDateFormat(Constantes.Fecha.FORMATO_FECHA_DEFAULT);
        return sdf.format(calendario.getTime());
    }

    public static Date agregarDiasFechaActualDate(int dias) {
        Calendar calendario = Calendar.getInstance();
        calendario.add(Calendar.DATE, dias);
        return calendario.getTime();
    }

    public static Date agregarDiasFechaDate(Date fecha, int dias) {
        Calendar calendario = Calendar.getInstance();
        calendario.setTime(fecha);
        calendario.add(Calendar.DATE, dias);
        return calendario.getTime();
    }

    public static Date agregarMesesFecha(Date date, int meses) {
        Calendar calendario = Calendar.getInstance();
        Date retorno = null;
        calendario.setTime(date);
        calendario.add(Calendar.MONTH, meses);
        retorno = calendario.getTime();
        return retorno;
    }

    public static Date agregarAniosFecha(Date date, int anios) {
        Calendar calendario = Calendar.getInstance();
        calendario.setTime(date);
        calendario.add(Calendar.YEAR, anios);
        return calendario.getTime();
    }

    public static int restarFechas1(Date dateMayor, Date dateMenor) {
        Calendar calendario1 = Calendar.getInstance();
        Calendar calendario2 = Calendar.getInstance();
        calendario1.setTime(dateMayor);
        calendario2.setTime(dateMenor);
        int dias = calendario1.get(Calendar.DAY_OF_YEAR) - calendario2.get(Calendar.DAY_OF_YEAR);
        return dias;
    }

    public static int restarFechas(Date dateMayor, Date dateMenor) {

        /*Calendar calendario1 = Calendar.getInstance();
        Calendar calendario2 = Calendar.getInstance();
        calendario1.setTime(dateMayor);
        calendario2.setTime(dateMenor);
        Date date1 = construirFecha(calendario1.get(Calendar.YEAR), calendario1.get(Calendar.MONTH), calendario1.get(Calendar.DATE), 0, 0, 0);

        Date date2 = construirFecha(calendario2.get(Calendar.YEAR), calendario2.get(Calendar.MONTH), calendario2.get(Calendar.DATE), 0, 0, 0);

*/
        long diferencia = dateMayor.getTime() - dateMenor.getTime();
        double dias = Math.floor(diferencia / (1000 * 60 * 60 * 24));

        return (int) dias;
    }

    public static Date toStartOfYear(int year) {
        Calendar calendar = Calendar.getInstance();
        calendar.set(year, 0, 1, 0, 0, 0);
        return calendar.getTime();
    }

    public static Date toEndOfYear(int year) {
        Calendar calendar = Calendar.getInstance();
        calendar.set(year + 1, 0, 1, 0, 0, -1);
        return calendar.getTime();
    }

    public static Date obtenerPrimerDiaMes(Date date) {
        Calendar calendario = Calendar.getInstance();
        calendario.setTime(date);
        calendario.set(Calendar.DAY_OF_MONTH, 1);
        return calendario.getTime();
    }

    public static Date obtenerUltimoDiaMes(Date date) {
        Calendar calendario = Calendar.getInstance();
        calendario.setTime(date);
        calendario.getActualMaximum(Calendar.DAY_OF_MONTH);
        return calendario.getTime();
    }
}
